/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package BaseDatos;

import static BaseDatos.GeneradorMySQL.BaseDatosMySQL.*;
import Controladores.GestorMensajes;
import com.mysql.jdbc.Statement;
import java.sql.SQLException;
import java.util.Stack;

/**
 *
 * @author Marko
 */
public class GestorBaseDatos{

////////////////////////////////////////////////////////////////////////////////
//  Constructores
////////////////////////////////////////////////////////////////////////////////
    
    /**
     * constructor por defecto de la clase
     */
    private GestorBaseDatos() {

    }

////////////////////////////////////////////////////////////////////////////////
//  Interfaz de la clase
////////////////////////////////////////////////////////////////////////////////
    
    /**
     * @return devuelve la instancia de la clase
     */
    public static GestorBaseDatos obtenerPermisosAdministradorBD(){
        if(administrador == null){
            administrador = new GestorBaseDatos();
            return administrador;
        }
        return administrador;
    }
        
    /**
     * crea la base de datos necesaria para el programa
     * @param _sentenciaMySQL 
     */
    public void crearBaseDatosSAPEC(Statement _sentenciaMySQL){
        GestorMensajes administradorMensajes = new GestorMensajes();
        administradorMensajes.mensaje("Creando la nueva base de datos para sapec");
        if(ejecutarSentenciaMySQL(NUEVA_BD, "sapecbd", _sentenciaMySQL)){
            administradorMensajes.mensaje("Base de datos creada con exito");
        }
        ejecutarSentenciaMySQL(USAR_BD, "sapecbd", _sentenciaMySQL);
    }

    /**
     * verifica la existencia de las tablas correspondientes, en caso de que no
     * exista una tabla solicita su creacion
     * @param _sentenciaMySQL 
     */
    public void verificarTablas(Statement _sentenciaMySQL){
        Stack<String> listaTablas = obtenerListaTablas();
        String instruccionMySQL = DESCRIBE_TABLA;
        while(!listaTablas.empty()){
            String tabla = listaTablas.pop();
            if(!ejecutarSentenciaMySQL(instruccionMySQL + tabla, tabla, _sentenciaMySQL)){
                crearTabla(tabla, _sentenciaMySQL);
            }
        }
    }
    
////////////////////////////////////////////////////////////////////////////////
//  Metodos Privados
////////////////////////////////////////////////////////////////////////////////
    
    /**
     * 
     * @return devuelve la lista de las tablas que necesita la base de datos
     */
    private Stack<String> obtenerListaTablas(){
        Stack<String> listaTablas = new Stack<>();
        listaTablas.push("administradores");
        listaTablas.push("alumnos");
        listaTablas.push("cancelaciones");
        listaTablas.push("devoluciones");
        listaTablas.push("empleados");
        listaTablas.push("equiposcomputo");
        listaTablas.push("prestamos");
        return listaTablas;
    }
    
    /**
     * crea la tabla que es solicitada
     * @param _tabla
     * @param _sentencia 
     */
    private void crearTabla(String _tabla, Statement _sentencia){
        GestorMensajes administradorMensajes = new GestorMensajes();
        administradorMensajes.mensaje("Creando la tabla de " + _tabla);
        switch(_tabla){
            case "administradores":
                if (ejecutarSentenciaMySQL(NUEVA_TABLA_ADMINISTRADORES, _tabla, _sentencia)){
                    administradorMensajes.mensaje("tabla de " + _tabla + " creada con exito");
                }
                break;
            case "alumnos":
                if (ejecutarSentenciaMySQL(NUEVA_TABLA_ALUMNOS, _tabla, _sentencia)){
                    administradorMensajes.mensaje("tabla de " + _tabla + " creada con exito");
                }
                break;
            case "cancelaciones":
                if (ejecutarSentenciaMySQL(NUEVA_TABLA_CANCELACIONES, _tabla, _sentencia)){
                    administradorMensajes.mensaje("tabla de " + _tabla + " creada con exito");
                }
                break;
            case "devoluciones":
                if (ejecutarSentenciaMySQL(NUEVA_TABLA_DEVOLUCIONES, _tabla, _sentencia)){
                    administradorMensajes.mensaje("tabla de " + _tabla + " creada con exito");
                }
                break;
            case "empleados":
                if (ejecutarSentenciaMySQL(NUEVA_TABLA_EMPLEADOS, _tabla, _sentencia)){
                    administradorMensajes.mensaje("tabla de " + _tabla + " creada con exito");
                }
                break;
            case "equiposcomputo":
                if (ejecutarSentenciaMySQL(NUEVA_TABLA_EQUIPOSCOMPUTO, _tabla, _sentencia)){
                    administradorMensajes.mensaje("tabla de " + _tabla + " creada con exito");
                }  
                break;
            case "prestamos":
                if (ejecutarSentenciaMySQL(NUEVA_TABLA_PRESTAMOS, _tabla, _sentencia)){
                    administradorMensajes.mensaje("tabla de " + _tabla + " creada con exito");
                }
                break;
        }
    }
    
    /**
     * Ejecuta las sentencias MySQl para la creacion de la base de datos y sus tablas
     * @param _instruccionMySQL 
     */
    private boolean ejecutarSentenciaMySQL(
     String _instruccionMySQL,
     String _datoReferencia,
     Statement _sentenciaMySQL
    ){
        try {
            _sentenciaMySQL.executeUpdate(_instruccionMySQL);
            return true;
        } catch (SQLException log) {
            GestorMensajes errorEncontrado = new GestorMensajes();
            errorEncontrado.mensajeError(log, _datoReferencia);
            return false;
        }
    }
    
////////////////////////////////////////////////////////////////////////////////
//  Declaracion de variables
////////////////////////////////////////////////////////////////////////////////
    private static GestorBaseDatos administrador = null;
}
